home *** CD-ROM | disk | FTP | other *** search
/ Atari Mega Archive 2 / Atari Mega Archive CD - Volume 2.iso / minix / up1510b.tgz / up1510b / src / commands / fold.c < prev    next >
C/C++ Source or Header  |  1990-07-19  |  1KB  |  67 lines

  1. /*  fold - folds long lines        Author: Terrence W. Holm */
  2.  
  3. /*  Usage:  fold  [ -width ]  [ file ... ]  */
  4.  
  5. #include <stdio.h>
  6.  
  7. #define  TAB        8
  8. #define  DEFAULT_WIDTH  80
  9.  
  10. int column = 0;            /* Current column, retained between files  */
  11.  
  12. main(argc, argv)
  13. int argc;
  14. char *argv[];
  15. {
  16.   int width = DEFAULT_WIDTH;
  17.   int i;
  18.   FILE *f;
  19.  
  20.   if (argc > 1 && argv[1][0] == '-') {
  21.     if ((width = atoi(&argv[1][1])) <= 0) {
  22.         fprintf(stderr, "Bad number for fold\n");
  23.         exit(1);
  24.     }
  25.     --argc;
  26.     ++argv;
  27.   }
  28.   if (argc == 1)
  29.     Fold(stdin, width);
  30.   else {
  31.     for (i = 1; i < argc; ++i) {
  32.         if ((f = fopen(argv[i], "r")) == NULL) {
  33.             perror(argv[i]);
  34.             exit(1);
  35.         }
  36.         Fold(f, width);
  37.         fclose(f);
  38.     }
  39.   }
  40.   exit(0);
  41. }
  42.  
  43.  
  44. Fold(f, width)
  45. FILE *f;
  46. int width;
  47. {
  48.   int c;
  49.  
  50.   while ((c = getc(f)) != EOF) {
  51.     if (c == '\t')
  52.         column = (column / TAB + 1) * TAB;
  53.     else if (c == '\b')
  54.         column = column > 0 ? column - 1 : 0;
  55.     else if (c == '\n' || c == '\r')
  56.         column = 0;
  57.     else
  58.         ++column;
  59.  
  60.     if (column > width) {
  61.         putchar('\n');
  62.         column = c == '\t' ? TAB : 1;
  63.     }
  64.     putchar(c);
  65.   }
  66. }
  67.